<?php
/**
 * Login actions
 *
 * @package sisptr
 * @subpackage login
 * @author Foxsis
 * @version 1.0
 */

class loginActions extends sfActionsFoxsis
{
	const SIGLA_APLICACAO             = 'LB';
	const NOME_APLICACAO              = 'Luxúria Brasileira';
	### MENSAGENS;
	const ERRO_LOGIN_SENHA            = 'O sistema não pode te autenticar. Favor informar login e senha corretos.';
	const ERRO_USUARIO_NAO_CADASTRADO = 'Usuário não possui permissão de acesso ao sistema. Favor solicitar permissão de acesso junto ao setor responsável pela execução do programa.';
	const ERRO_SENHA_EXPIRADA         = 'A sua senha expirou.';
	const MSG_NAO_LOGADO              = 'Você não está logado ou sua sessão expirou. Por favor digite seus dados de acesso.';
	const MSG_NAO_AUTORIZADO          = 'O usuário não tem as credenciais necessárias.';
	const MSG_LOGADO_COM_SUCESSO      = "Você se autenticou com sucesso com o usuário '%s'";
	const ERRO_SEM_PERFIS             = 'Usuário não tem permissão de acesso a nenhum perfil do sistema MFC. Favor verificar.';
	const MSG_USUARIO_INVALIDO        = 'Usuário ou senha inválidos';
	const MSG_TROCAR_SENHA		  	  = 'Para sua segurança, troque sua senha.';
	const MSG_ERRO_CARREGAR_USUARIO   = 'Não foi possível recuperar informações do usuário com o e-mail informado.';

	public function executeIndex()
	{
		if($this->getUser()->isAuthenticated())
		{
			$this->redirect('index/index');
		}
		else
		{
			$this->setSigninReferer();
		}
	}

	public function executeRelembrarSenha()
	{

	}

	public function executeNaoAutenticado()
	{
		$parametros	= $this->getRequest()->getParameterHolder()->getAll('symfony/default');
		$referer	= null;

		if (isset($parametros['module']))
		$referer.= $parametros['module'];

		if (isset($parametros['action']))
		$referer.= '/'.$parametros['action'];

		foreach ($parametros as $key => $value)
		{
			if ($key != 'module' && $key != 'action')
			$referer.= '&'.$key.'='.$value;
		}

		$pos = strpos($referer,'&');
		if ($pos)
		{
			$referer[$pos] = '?';  	  	//$referer = substr_replace($referer, '?', $pos, 1);
		}

		$_SESSION['referer'] = $referer;
		$this->getUser()->setFlash('erro', self::MSG_NAO_LOGADO);

		return $this->forward('login','index');
	}

	public function executeNaoAutorizado()
	{
		$this->setFlash('erro', self::MSG_NAO_AUTORIZADO);
		$this->redirect('login/index');
	}

	private function setSigninReferer()
	{
		$default_referer = '@homepage';
		if ($this->getContext()->getActionStack()->getSize() > 0) {
			$action = $this->getContext()->getActionStack()->getFirstEntry()->getActionInstance();
			$security = $action->getSecurityConfiguration();
			$action_name = $this->getContext()->getActionStack()->getFirstEntry()->getActionName();

			if (
			(isset($security[$action_name]['is_secure']) && $security[$action_name]['is_secure'])
			||
			(isset($security['all']['is_secure']) && $security['all']['is_secure'])
			){
				$referer = $this->getRequest()->getUri();
				//$this->getUser()->setFlash('mensagem', self::MSG_NAO_LOGADO, false);
			} else {
				$referer = $default_referer;
			}
		} else {
			$referer = $default_referer;
		}
		$this->getUser()->setAttribute('referer', $referer);
	}

	public function executeLogout()
	{
		$this->getUser()->setAuthenticated(false);
		$this->getUser()->getAttributeHolder()->clear();
		$this->redirect('login/index');
	}

	public function executeLogin(sfWebRequest $request)
	{
		$login    = trim($request->getParameter('login'));
		$senha    = trim($request->getParameter('password'));

		if($login == '' || $senha == '')
		{
			$this->getUser()->setFlash('erro', self::MSG_USUARIO_INVALIDO, false);
		}
		else
		{
			$autentica = new AutenticacaoBasica($login, $senha);
			if($autentica->autenticou())
			{
				$u = $autentica->getUsuario();
				//$arPerfis = $u->lerPerfisPorAplicacao(self::SIGLA_APLICACAO); //config.php do login
				//if(!count($arPerfis))
				//{
					//$this->getUser()->setFlash('erro',self::ERRO_SEM_PERFIS,false);
				//}
				//else
				{
					$this->getUser()->setCulture('pt_BR');
					$this->getUser()->setAuthenticated(true);
					$this->getUser()->setAttribute('id_usuario', $u->id_usuario);
					$this->getUser()->setAttribute('ds_nome',	 $u->ds_nome);
					$this->getUser()->setAttribute('ds_email',	 $u->ds_email);
					$this->getUser()->setAttribute('ds_login',	 $u->ds_login);
					$this->getUser()->setAttribute('tp_status',	 $u->tp_status);

					$this->getUser()->clearCredentials(true);
					//$this->getUser()->setCredentials(array($u->Grupo->nome));
					$referer = $this->getUser()->getAttribute('referer');
					$this->getUser()->getAttributeHolder()->remove('referer');

					if (isset($_SESSION['referer']))
					{
						$referer = $_SESSION['referer'];
						unset($_SESSION['referer']);
					}

					$this->redirect($referer);
				}
			}
			else
			{
				$this->getUser()->setFlash('erro',$autentica->getErro(),false);
			}
		}

		$this->forward($this->getModuleName(), 'index');
	}

	public function handleErrorLogin()
	{
		return $this->forward($this->getModuleName(), 'index');
	}

	public function executeEnviarSenha(sfWebRequest $request)
	{
		try
		{
			$formData = new FormData($this->getRequestParameter('usuario'));
			$formData->setCulture($this->getUser()->getCulture());

			if(!$formData->get('ds_email'))
				throw new Exception('É obrigatório informar o email.');

			$criterio = array('ds_email' => $formData->get('ds_email'));
			$consulta = ParticipanteTable::consultarParticipante($criterio);
			$usuario = $consulta->fetchOne();

			if($usuario['id_usuario'] != "")
			{
				Doctrine_Manager::getInstance()->getCurrentConnection()->beginTransaction();

				$novaSenha = Util::gerarString(8);
				$usuario = Doctrine::getTable('Participante')->find($usuario['id_usuario']);
				$usuario->set('ds_senha', md5($novaSenha));
				$usuario->save();
				Doctrine_Manager::getInstance()->getCurrentConnection()->commit();

				$this->usuario = $usuario;
				$this->nova_senha = $novaSenha;

				$html = utf8_decode(Util::getHtmlContent($this, 'email'));

				$this->enviarSenha($usuario, $html);

			}
			else
			{
				throw new Exception(self::MSG_ERRO_CARREGAR_USUARIO);
			}
		}
		catch(Exception $e)
		{
			//Doctrine_Manager::getInstance()->getCurrentConnection()->rollback();
			$this->getUser()->setFlash('erro', $e->getMessage(), true);
			$this->redirect('esqueci_senha');
		}
	}

	public function enviarSenha($usuario, $msg)
	{
		// class initialization
	    $mail = new sfMail();
	    $mail->setCharset('utf-8');

	     // definition of the required parameters
	    $mail->setSender('boxbook@marcelobento.com.br', "BOX BOOK");
	    $mail->setFrom('boxbook@marcelobento.com.br', "BOX BOOK");
	    $mail->addReplyTo('boxbook@marcelobento.com.br', 'BOX BOOK');
	    $mail->addAddress($usuario->get('email'));
	    $mail->setSubject('[BOXBOOK] Dados de acesso.');
	    $mail->setContentType('text/html');
	    $mail->setBody($msg);
   	 	$mail->send();

		$this->getUser()->setFlash('orientacao', 'Foi enviado um email para ' . $usuario['email'] . ' com os dados de acesso ao sistema.', true);
		$this->redirect('esqueci_senha');
	}
}